//**************************************************
//non-intrusive linklist
//**************************************************
#ifndef T_LINK_LIST_ZHU
#define T_LINK_LIST_ZHU
#include "link_list.h"

template<typename T>
struct TLink:public Link
{
    T& value(){
            return value_;
    }
    const T& value()const{
            return value_;
    }
    TLink():Link(0){
    }
    
private:
    friend class Cursor;
    T value_;
};

template<typename T>
struct TLinkList:private LinkList
{
    friend class Cursor;
    
    TLinkList():head_(&head_){}
    ~TLinkList(){assert(is_empty());}
    T& operator[](Cursor const& p){
            return *static_cast<TLink<T>*>(p.p_)->value();
    }
    const T& operator[](const Cursor& p)const{
            return *static_cast<TLink<T>*>(p.p_)->value();
    }
    void insert(Cursor p, TLink<T>* link){
        LinkList::insert(p, link);
    }
    TLink<T>* extract(Cursor p){
        return static_cast<TLink<T>*>(LinkList::extractor(p));
    }
    
    Cursor first(){
            return Cursor(&head_);
    }
    bool is_last(Cursor const& p)const{
            return p.p_ == &head_;
    }
    bool is_empty()const{
            return head_.next_ == &head_;
    }
private:
    Link head_;
};

#endif
